https://www.forbes.com/sites/brentdykes/2016/03/31/data-storytelling-the-essential-data-science-skill-everyone-needs/#162a67752ad4

http://r-statistics.co/Complete-Ggplot2-Tutorial-Part2-Customizing-Theme-With-R-Code.html

  1. Declutter your graph
  2. Highlight your important data
  3. Annotate your findings

Intro to R Markdown Notebooks

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter. You can also use the green “play” button on the top right of the chunk.

Data Storytelling

Let’s look at the basic dataset first

library(tidyverse)
## -- Attaching packages ---------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.2.0     v purrr   0.3.2
## v tibble  2.1.3     v dplyr   0.8.3
## v tidyr   1.0.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.4.0
## -- Conflicts ------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
load("data/crime_data_stat.rda")
crime_data_stat <- crime_data_stat %>% ungroup()
DT::datatable(crime_data_stat)

Summarizing the data

skimr::skim(crime_data_stat)

Part 1: Your Basic Plot

We’re going to start working with a basic visualization.

library(ggplot2)

ggplot(crime_data_stat) + 
  aes(x = crime_yearmonth, y= count, group=offense_category, 
      color = offense_category) + 
  geom_line()

While this visualization might be good for exploratory purposes, for explanatory purposes, it is a little too complicated to communicate one finding about the data.

Let’s save our plot into an R object called a ggplot. We’ll use the <- to assign it to the variable called my_plot:

my_plot <- 
  ggplot(crime_data_stat) + 
  aes(x = crime_yearmonth, y= count, group=offense_category, 
      color = offense_category) + 
  geom_line()

Now, when we want to modify our plot, we can use my_plot. More on this below.

Before you move on, discuss with your partner:

  1. What variable is mapped to the x axis? What is the name of that variable?
  2. What crimes are represented in the data?

Part 2: Simplifying your plot

The neat thing about ggplot2 is that you can modify the plot code by adding modifiers with the + (plus) sign.

We’re going to take a “paper doll” approach to our plot to modifying it - each modifier can be thought of as a set of “clothes” that we dress our plot in.

The defaults for the plot are decent, but have some distracting elements. We can declutter our plot by removing some of these distracting elements.

Before you move on, discuss:

  1. What parts of the plot are distracting from your message?

A lot of the simplification can come from built in themes. Adding theme_minimal() will remove a lot of the background elements. Try it out and compare it with the above plot.

my_plot + theme_minimal()

Optional: Other themes

If you have time, try these other themes out:

#paste the "+" at the end of your statement
+ 
theme_bw()
+ 
theme_void()

Simplifying using theme()

We can customize our plot even further by adding a theme() function to the end of our plot. We’ll use this to remove individual elements from the plot.

theme() looks very intimidating, because it has lots of different arguments. We’ll only look at a few of these:

  • axis.title, axis.title.x and axis.title.y (The labels for the axes)
  • panel.grid (grid lines)
  • legend.position (Placing the legend, including removing it)

How will we remove these elements? We will specify an element called element_blank() to these arguments. What is this? Think of it as a special placeholder that says we don’t want to see this element.

Let’s try simplifying our plot by removing the x-axis text. By context, the label crime_yearmonth isn’t that helpful.

my_plot + 
  theme(axis.title.x = element_blank())

Try removing the legend. Hmm, it is more simplified, but we have lost all the information about the categories! We can add that information back with the use of color in the next section.

my_plot + 
  theme(legend.position = "none")

Try removing the gridlines:

my_plot + 
  theme(panel.grid = element_blank())

Your turn

Play with different combinations of these different theme() statements to customize your plot.

my_plot +
  theme_minimal() + 
  theme(axis.title.x = element_blank()) + 
  theme(panel.grid = element_blank()) + 
  theme(legend.position = "none")

Part 3: Annotating

Another way we can guide people through our visualization is by using annotations, which can be very helpful.

  1. Changing Titles and Axis Titles using labs()
  2. Adding reference lines using geom_hline() and geom_vline()
  3. Annotating the plot directly using annotate()

Before you move on, discuss:

# crime_data_stat %>% 
#   mutate(motor_theft = 
#            ifelse(offense_category == 
#                     "Motor Vehicle Theft", "Y", "N")) %>% 
#   ggplot(aes(x = crime_yearmonth, y= count, 
#              group=offense_category, color = motor_theft)) + 
#    geom_line() + 
#   scale_color_manual(values=c("Y"="blue", "N"="darkgrey")) +
#   theme_minimal() + 
#   theme(legend.position = "none") 

my_plot +
  labs(title = "Auto Crimes are Levelling Off Compared to Other Crimes",x="Year", y="Number of Crimes")

Adding a Reference Line

Using geom_hline() to show the average value across a time period can provide a useful reference for viewers:

# crime_stat %>%  
#   ungroup(offense_category) %>%
#   ggplot(aes(x = crime_yearmonth, y= count, 
#              group=offense_category, fill = motor_theft)) + 
#    geom_bar(stat = "identity", color="black") + 
#   scale_fill_manual(values=c("Y"="blue", "N"="grey")) +
#   theme_minimal() + 
#   theme(legend.position = "none") +
#   labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year", y="Number of Crimes") +

crime_stat <- crime_data_stat %>% 
  mutate(motor_theft = 
           ifelse(offense_category == 
                    "Motor Vehicle Theft", "Y", "N"),
         mean_count=mean(count)) 

mean_c <- crime_stat$mean_count[1]

  
my_plot + 
  annotate("text", x = as.Date("2016-03-01"), y=600, label="Mean\n Crime") + 
  geom_hline(yintercept = mean_c, lty=3)

Adding text annotations

Adding text annotations directly to the graph can be extremely helpful, especially if there is a point of interest you want users to look at. (For adding text information per data point, look at geom_text() and geom_repel() from the ggrepel package).

The first argument to annotate() is “text”, and it takes x and y arguments to determine the position of our annotation. Since our x axis is a Date, we need to specify the x coordinate in terms of Dates.

Try adjusting the y argument to get the annotation more centered around the mean line.

# crime_stat %>%  
#   ungroup(offense_category) %>%
#   ggplot(aes(x = crime_yearmonth, y= count, 
#              group=offense_category, fill = motor_theft)) + 
#    geom_bar(stat = "identity", color="black") + 
#   scale_fill_manual(values=c("Y"="blue", "N"="grey")) +
#   theme_minimal() + 
#   theme(legend.position = "none") +
#   labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year", y="Number of Crimes") +
  
my_plot + 
  annotate(geom = "text", 
           x = as.Date("2016-03-01"), y=600, 
           label="Mean Automotive\n Thefts") + 
  geom_hline(yintercept = mean_c, lty=3)

# crime_stat %>%  
#   ungroup(offense_category) %>%
#   ggplot(aes(x = crime_yearmonth, y= count, 
#              group=offense_category, color = motor_theft)) + 
#    geom_line() + 
#   scale_color_manual(values=c("Y"="darkorange", "N"="grey")) +
#   theme_minimal() + 
#   theme(panel.grid = element_blank()) +
#   theme(legend.position = "none") 

my_plot +
  labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year", y="Number of Crimes") +
  annotate("text", x = as.Date("2018-03-01"), y=650, label="Mean\n Crime") + 
  geom_hline(yintercept = mean_c, lty=3)

Part 3: Your Turn

Experiment with the following modifications to the graph. If you have time, cut and paste the modifications you decided on in part 2 to your graph.

my_plot +
  labs(title = "Auto Crimes are Levelling Off Compared to Other Crimes",x="Year", y="Number of Crimes") + 
  annotate("text", x = as.Date("2018-03-01"), y=650, label="Mean\n Crime") + 
  geom_hline(yintercept = mean_c, lty=3)

Part 4: Working with Color/Contrast

Highlighting part of your data

What if we only want to highlight one group in the data?

Before you move on, discuss:

  1. What is your finding?
  2. What part/group of the data were you emphasizing?
  3. What colors did you use?

We can manually color a single group in our data through a two step process. For example, if we want to highlight “Motor Vehicle Theft” but not the others we can:

  1. make a “dummy” variable called motor_theft by recoding the offense_category variable to have Y for Motor Vehicle Theft and N for the other categories
  2. manually color the lines using scale_color_manual() by specifying a values argument.

Using a dummy variable in our dataset

We can add a new variable using what is called a mutate() function. It lets us calculate a new variable, based on the other values of the variable. If you’ve used Excel’s IF() function, it’s very similar in terms of the syntax. We first provide a condition:

ifelse(offense_category == "Motor Vehicle Theft", 
                  yes = "Y", no = "N")

The ifelse() function can be read:

If the value for offense_category is “Motor Vehicle Theft” THEN recode that value as “Y”, If it doesn’t equal “Motor Vehicle Theft”, THEN recode that value as “N”

Run the code below and explore the table a little bit to confirm that “Motor Vehicle Theft” crimes are coded as Y in our new variable, motor_theft:

crime_stat <- crime_data_stat %>% 
  mutate(motor_theft = 
           ifelse(offense_category == "Motor Vehicle Theft", 
                  yes = "Y", no = "N")) 

DT::datatable(crime_stat)

Using scale_color_manual() to color our new variable

Now we have our new variable called motor_theft, we need to map the Y and N values to actual colors. We can do this by using the scale_color_manual() function, which lets us map values to specific colors by using the values argument.

#put your final plot here
library(tidyverse)

  ggplot(crime_stat, aes(x = crime_yearmonth, y= count, group=offense_category, color = motor_theft)) + 
   geom_line() + scale_color_manual(values=c("Y"="blue", "N"="grey"))

Try out mapping colors

Try using different colors to contrast the motor_theft line. A small list of color names in R can be found here: https://www.r-graph-gallery.com/42-colors-names.html

If you want all of the color names (there are a lot of them!) you can run this code block:

colors()
##   [1] "white"                "aliceblue"            "antiquewhite"        
##   [4] "antiquewhite1"        "antiquewhite2"        "antiquewhite3"       
##   [7] "antiquewhite4"        "aquamarine"           "aquamarine1"         
##  [10] "aquamarine2"          "aquamarine3"          "aquamarine4"         
##  [13] "azure"                "azure1"               "azure2"              
##  [16] "azure3"               "azure4"               "beige"               
##  [19] "bisque"               "bisque1"              "bisque2"             
##  [22] "bisque3"              "bisque4"              "black"               
##  [25] "blanchedalmond"       "blue"                 "blue1"               
##  [28] "blue2"                "blue3"                "blue4"               
##  [31] "blueviolet"           "brown"                "brown1"              
##  [34] "brown2"               "brown3"               "brown4"              
##  [37] "burlywood"            "burlywood1"           "burlywood2"          
##  [40] "burlywood3"           "burlywood4"           "cadetblue"           
##  [43] "cadetblue1"           "cadetblue2"           "cadetblue3"          
##  [46] "cadetblue4"           "chartreuse"           "chartreuse1"         
##  [49] "chartreuse2"          "chartreuse3"          "chartreuse4"         
##  [52] "chocolate"            "chocolate1"           "chocolate2"          
##  [55] "chocolate3"           "chocolate4"           "coral"               
##  [58] "coral1"               "coral2"               "coral3"              
##  [61] "coral4"               "cornflowerblue"       "cornsilk"            
##  [64] "cornsilk1"            "cornsilk2"            "cornsilk3"           
##  [67] "cornsilk4"            "cyan"                 "cyan1"               
##  [70] "cyan2"                "cyan3"                "cyan4"               
##  [73] "darkblue"             "darkcyan"             "darkgoldenrod"       
##  [76] "darkgoldenrod1"       "darkgoldenrod2"       "darkgoldenrod3"      
##  [79] "darkgoldenrod4"       "darkgray"             "darkgreen"           
##  [82] "darkgrey"             "darkkhaki"            "darkmagenta"         
##  [85] "darkolivegreen"       "darkolivegreen1"      "darkolivegreen2"     
##  [88] "darkolivegreen3"      "darkolivegreen4"      "darkorange"          
##  [91] "darkorange1"          "darkorange2"          "darkorange3"         
##  [94] "darkorange4"          "darkorchid"           "darkorchid1"         
##  [97] "darkorchid2"          "darkorchid3"          "darkorchid4"         
## [100] "darkred"              "darksalmon"           "darkseagreen"        
## [103] "darkseagreen1"        "darkseagreen2"        "darkseagreen3"       
## [106] "darkseagreen4"        "darkslateblue"        "darkslategray"       
## [109] "darkslategray1"       "darkslategray2"       "darkslategray3"      
## [112] "darkslategray4"       "darkslategrey"        "darkturquoise"       
## [115] "darkviolet"           "deeppink"             "deeppink1"           
## [118] "deeppink2"            "deeppink3"            "deeppink4"           
## [121] "deepskyblue"          "deepskyblue1"         "deepskyblue2"        
## [124] "deepskyblue3"         "deepskyblue4"         "dimgray"             
## [127] "dimgrey"              "dodgerblue"           "dodgerblue1"         
## [130] "dodgerblue2"          "dodgerblue3"          "dodgerblue4"         
## [133] "firebrick"            "firebrick1"           "firebrick2"          
## [136] "firebrick3"           "firebrick4"           "floralwhite"         
## [139] "forestgreen"          "gainsboro"            "ghostwhite"          
## [142] "gold"                 "gold1"                "gold2"               
## [145] "gold3"                "gold4"                "goldenrod"           
## [148] "goldenrod1"           "goldenrod2"           "goldenrod3"          
## [151] "goldenrod4"           "gray"                 "gray0"               
## [154] "gray1"                "gray2"                "gray3"               
## [157] "gray4"                "gray5"                "gray6"               
## [160] "gray7"                "gray8"                "gray9"               
## [163] "gray10"               "gray11"               "gray12"              
## [166] "gray13"               "gray14"               "gray15"              
## [169] "gray16"               "gray17"               "gray18"              
## [172] "gray19"               "gray20"               "gray21"              
## [175] "gray22"               "gray23"               "gray24"              
## [178] "gray25"               "gray26"               "gray27"              
## [181] "gray28"               "gray29"               "gray30"              
## [184] "gray31"               "gray32"               "gray33"              
## [187] "gray34"               "gray35"               "gray36"              
## [190] "gray37"               "gray38"               "gray39"              
## [193] "gray40"               "gray41"               "gray42"              
## [196] "gray43"               "gray44"               "gray45"              
## [199] "gray46"               "gray47"               "gray48"              
## [202] "gray49"               "gray50"               "gray51"              
## [205] "gray52"               "gray53"               "gray54"              
## [208] "gray55"               "gray56"               "gray57"              
## [211] "gray58"               "gray59"               "gray60"              
## [214] "gray61"               "gray62"               "gray63"              
## [217] "gray64"               "gray65"               "gray66"              
## [220] "gray67"               "gray68"               "gray69"              
## [223] "gray70"               "gray71"               "gray72"              
## [226] "gray73"               "gray74"               "gray75"              
## [229] "gray76"               "gray77"               "gray78"              
## [232] "gray79"               "gray80"               "gray81"              
## [235] "gray82"               "gray83"               "gray84"              
## [238] "gray85"               "gray86"               "gray87"              
## [241] "gray88"               "gray89"               "gray90"              
## [244] "gray91"               "gray92"               "gray93"              
## [247] "gray94"               "gray95"               "gray96"              
## [250] "gray97"               "gray98"               "gray99"              
## [253] "gray100"              "green"                "green1"              
## [256] "green2"               "green3"               "green4"              
## [259] "greenyellow"          "grey"                 "grey0"               
## [262] "grey1"                "grey2"                "grey3"               
## [265] "grey4"                "grey5"                "grey6"               
## [268] "grey7"                "grey8"                "grey9"               
## [271] "grey10"               "grey11"               "grey12"              
## [274] "grey13"               "grey14"               "grey15"              
## [277] "grey16"               "grey17"               "grey18"              
## [280] "grey19"               "grey20"               "grey21"              
## [283] "grey22"               "grey23"               "grey24"              
## [286] "grey25"               "grey26"               "grey27"              
## [289] "grey28"               "grey29"               "grey30"              
## [292] "grey31"               "grey32"               "grey33"              
## [295] "grey34"               "grey35"               "grey36"              
## [298] "grey37"               "grey38"               "grey39"              
## [301] "grey40"               "grey41"               "grey42"              
## [304] "grey43"               "grey44"               "grey45"              
## [307] "grey46"               "grey47"               "grey48"              
## [310] "grey49"               "grey50"               "grey51"              
## [313] "grey52"               "grey53"               "grey54"              
## [316] "grey55"               "grey56"               "grey57"              
## [319] "grey58"               "grey59"               "grey60"              
## [322] "grey61"               "grey62"               "grey63"              
## [325] "grey64"               "grey65"               "grey66"              
## [328] "grey67"               "grey68"               "grey69"              
## [331] "grey70"               "grey71"               "grey72"              
## [334] "grey73"               "grey74"               "grey75"              
## [337] "grey76"               "grey77"               "grey78"              
## [340] "grey79"               "grey80"               "grey81"              
## [343] "grey82"               "grey83"               "grey84"              
## [346] "grey85"               "grey86"               "grey87"              
## [349] "grey88"               "grey89"               "grey90"              
## [352] "grey91"               "grey92"               "grey93"              
## [355] "grey94"               "grey95"               "grey96"              
## [358] "grey97"               "grey98"               "grey99"              
## [361] "grey100"              "honeydew"             "honeydew1"           
## [364] "honeydew2"            "honeydew3"            "honeydew4"           
## [367] "hotpink"              "hotpink1"             "hotpink2"            
## [370] "hotpink3"             "hotpink4"             "indianred"           
## [373] "indianred1"           "indianred2"           "indianred3"          
## [376] "indianred4"           "ivory"                "ivory1"              
## [379] "ivory2"               "ivory3"               "ivory4"              
## [382] "khaki"                "khaki1"               "khaki2"              
## [385] "khaki3"               "khaki4"               "lavender"            
## [388] "lavenderblush"        "lavenderblush1"       "lavenderblush2"      
## [391] "lavenderblush3"       "lavenderblush4"       "lawngreen"           
## [394] "lemonchiffon"         "lemonchiffon1"        "lemonchiffon2"       
## [397] "lemonchiffon3"        "lemonchiffon4"        "lightblue"           
## [400] "lightblue1"           "lightblue2"           "lightblue3"          
## [403] "lightblue4"           "lightcoral"           "lightcyan"           
## [406] "lightcyan1"           "lightcyan2"           "lightcyan3"          
## [409] "lightcyan4"           "lightgoldenrod"       "lightgoldenrod1"     
## [412] "lightgoldenrod2"      "lightgoldenrod3"      "lightgoldenrod4"     
## [415] "lightgoldenrodyellow" "lightgray"            "lightgreen"          
## [418] "lightgrey"            "lightpink"            "lightpink1"          
## [421] "lightpink2"           "lightpink3"           "lightpink4"          
## [424] "lightsalmon"          "lightsalmon1"         "lightsalmon2"        
## [427] "lightsalmon3"         "lightsalmon4"         "lightseagreen"       
## [430] "lightskyblue"         "lightskyblue1"        "lightskyblue2"       
## [433] "lightskyblue3"        "lightskyblue4"        "lightslateblue"      
## [436] "lightslategray"       "lightslategrey"       "lightsteelblue"      
## [439] "lightsteelblue1"      "lightsteelblue2"      "lightsteelblue3"     
## [442] "lightsteelblue4"      "lightyellow"          "lightyellow1"        
## [445] "lightyellow2"         "lightyellow3"         "lightyellow4"        
## [448] "limegreen"            "linen"                "magenta"             
## [451] "magenta1"             "magenta2"             "magenta3"            
## [454] "magenta4"             "maroon"               "maroon1"             
## [457] "maroon2"              "maroon3"              "maroon4"             
## [460] "mediumaquamarine"     "mediumblue"           "mediumorchid"        
## [463] "mediumorchid1"        "mediumorchid2"        "mediumorchid3"       
## [466] "mediumorchid4"        "mediumpurple"         "mediumpurple1"       
## [469] "mediumpurple2"        "mediumpurple3"        "mediumpurple4"       
## [472] "mediumseagreen"       "mediumslateblue"      "mediumspringgreen"   
## [475] "mediumturquoise"      "mediumvioletred"      "midnightblue"        
## [478] "mintcream"            "mistyrose"            "mistyrose1"          
## [481] "mistyrose2"           "mistyrose3"           "mistyrose4"          
## [484] "moccasin"             "navajowhite"          "navajowhite1"        
## [487] "navajowhite2"         "navajowhite3"         "navajowhite4"        
## [490] "navy"                 "navyblue"             "oldlace"             
## [493] "olivedrab"            "olivedrab1"           "olivedrab2"          
## [496] "olivedrab3"           "olivedrab4"           "orange"              
## [499] "orange1"              "orange2"              "orange3"             
## [502] "orange4"              "orangered"            "orangered1"          
## [505] "orangered2"           "orangered3"           "orangered4"          
## [508] "orchid"               "orchid1"              "orchid2"             
## [511] "orchid3"              "orchid4"              "palegoldenrod"       
## [514] "palegreen"            "palegreen1"           "palegreen2"          
## [517] "palegreen3"           "palegreen4"           "paleturquoise"       
## [520] "paleturquoise1"       "paleturquoise2"       "paleturquoise3"      
## [523] "paleturquoise4"       "palevioletred"        "palevioletred1"      
## [526] "palevioletred2"       "palevioletred3"       "palevioletred4"      
## [529] "papayawhip"           "peachpuff"            "peachpuff1"          
## [532] "peachpuff2"           "peachpuff3"           "peachpuff4"          
## [535] "peru"                 "pink"                 "pink1"               
## [538] "pink2"                "pink3"                "pink4"               
## [541] "plum"                 "plum1"                "plum2"               
## [544] "plum3"                "plum4"                "powderblue"          
## [547] "purple"               "purple1"              "purple2"             
## [550] "purple3"              "purple4"              "red"                 
## [553] "red1"                 "red2"                 "red3"                
## [556] "red4"                 "rosybrown"            "rosybrown1"          
## [559] "rosybrown2"           "rosybrown3"           "rosybrown4"          
## [562] "royalblue"            "royalblue1"           "royalblue2"          
## [565] "royalblue3"           "royalblue4"           "saddlebrown"         
## [568] "salmon"               "salmon1"              "salmon2"             
## [571] "salmon3"              "salmon4"              "sandybrown"          
## [574] "seagreen"             "seagreen1"            "seagreen2"           
## [577] "seagreen3"            "seagreen4"            "seashell"            
## [580] "seashell1"            "seashell2"            "seashell3"           
## [583] "seashell4"            "sienna"               "sienna1"             
## [586] "sienna2"              "sienna3"              "sienna4"             
## [589] "skyblue"              "skyblue1"             "skyblue2"            
## [592] "skyblue3"             "skyblue4"             "slateblue"           
## [595] "slateblue1"           "slateblue2"           "slateblue3"          
## [598] "slateblue4"           "slategray"            "slategray1"          
## [601] "slategray2"           "slategray3"           "slategray4"          
## [604] "slategrey"            "snow"                 "snow1"               
## [607] "snow2"                "snow3"                "snow4"               
## [610] "springgreen"          "springgreen1"         "springgreen2"        
## [613] "springgreen3"         "springgreen4"         "steelblue"           
## [616] "steelblue1"           "steelblue2"           "steelblue3"          
## [619] "steelblue4"           "tan"                  "tan1"                
## [622] "tan2"                 "tan3"                 "tan4"                
## [625] "thistle"              "thistle1"             "thistle2"            
## [628] "thistle3"             "thistle4"             "tomato"              
## [631] "tomato1"              "tomato2"              "tomato3"             
## [634] "tomato4"              "turquoise"            "turquoise1"          
## [637] "turquoise2"           "turquoise3"           "turquoise4"          
## [640] "violet"               "violetred"            "violetred1"          
## [643] "violetred2"           "violetred3"           "violetred4"          
## [646] "wheat"                "wheat1"               "wheat2"              
## [649] "wheat3"               "wheat4"               "whitesmoke"          
## [652] "yellow"               "yellow1"              "yellow2"             
## [655] "yellow3"              "yellow4"              "yellowgreen"
library(tidyverse)

my_new_plot <-   ggplot(crime_stat, aes(x = crime_yearmonth, y= count, group=offense_category, color = motor_theft)) + 
   geom_line()

my_new_plot + 
  scale_color_manual(values=c("Y"="blue", "N"="grey"))

Put it all together!

Cut and paste all your modifiers and make your final figure below!

my_new_plot +

Optional: Highlighting a subset of the data

What if we wanted to highlight a specific time period in our dataset? We can actually subset the data

We want to specify this criteria in our filter() statement:

crime_subset <- crime_stat %>%
  filter(crime_yearmonth >= "2017-01-01") %>%
  filter(crime_yearmonth <= "2018-01-01")

Now we can use this dataset to highlight this portion of the data:

  crime_stat %>% ggplot(aes(x = crime_yearmonth, y= count, group=offense_category)) + 
   geom_line(color = "grey") +
   geom_line(data = crime_subset, color = "blue") +
  geom_vline(xintercept = as.Date("2017-01-01"), color="blue", lty=3) +
  geom_vline(xintercept = as.Date("2018-01-01"), color="blue", lty=3) +
  annotate("text", x=as.Date("2017-06-01"), y= 1200, label= "Time period\n of Interest", color="blue") +
  labs(title = "Motor Thefts in 2017-2018 are flat") +
  theme_minimal() +
    theme(axis.title.x = element_blank()) +
  theme(panel.grid = element_blank()) 

What if we wanted to show only the “Motor Vehicle Theft” category in blue? Then we can add an additional filter() statement in our subset:

crime_subset <- crime_stat %>%
  filter(crime_yearmonth >= "2017-01-01") %>%
  filter(crime_yearmonth <= "2018-01-01") %>%
  filter(offense_category == 
                    "Motor Vehicle Theft")

  crime_stat %>% ggplot(aes(x = crime_yearmonth, y= count, group=offense_category)) + 
   geom_line(color = "grey") +
   geom_line(data = crime_subset, color = "blue") +
  geom_vline(xintercept = as.Date("2017-01-01"), color="blue", lty=3) +
  geom_vline(xintercept = as.Date("2018-01-01"), color="blue", lty=3) +
  annotate("text", x=as.Date("2017-06-01"), y= 1200, label= "Time period\n of Interest") +
  labs(title = "Crimes in 2017-2018 are flat") +
  theme_minimal() +
    theme(axis.title.x = element_blank()) +
  theme(panel.grid = element_blank()) 

Saving High Quality Plots

We can use ggsave() to save our plot.

ggsave("timeplot.pdf")

Interactive plots: using plotly

plotly is a JavaScript library that allows you to make plots that are interactive on a webpage. Mousing over traces can reveal what’s called a tooltip - additional information about that datapoint that you can specify

Once the plots are built, they don’t require R to run, so they can be hosted on a site for static webpages.

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
crime_stat <- crime_data_stat %>% 
  mutate(motor_theft = 
           ifelse(offense_category == 
                    "Motor Vehicle Theft", "Y", "N"),
         mean_count=mean(count)) 

mean_c <- crime_stat$mean_count[1]

my_plot <- crime_stat %>%  
  ungroup(offense_category) %>%
  ggplot(aes(x = crime_yearmonth, y= count, 
             group=offense_category, color = motor_theft)) + 
   geom_line() + 
  scale_color_manual(values=c("Y"="blue", "N"="grey")) +
  theme_minimal() +
  theme(panel.grid = element_blank()) +
  theme(legend.position = "none") +
  labs(title = "Auto Crimes are Levelling Off\n Compared to Other Crimes",x="Year/Month", y="Number of Crimes") +
  annotate("text", x = as.Date("2016-03-01"), y=600, label="Mean\n Crime") + 
  geom_hline(yintercept = mean_c, lty=3)

ggplotly(my_plot)

Finishing up

Try